package com.ihy.service.impl;

import com.ihy.dao.mybatis.DaoQQUser;
import com.ihy.entity.QQUser;
import com.ihy.service.ServiceQQUser;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * qq用户业务层
 * <p>
 * Transactional注解：
 * 描述单个方法或类的事务属性。
 * 在类级别，此注解作为默认值应用于声明类及其子类的所有方法。注意，它不适用于类层次结构上的祖先类；方法需要在本地重新声明，以便参与子类级别的注解。
 * <p>
 * Service注解：
 * 表示带注解的类是“服务”，最初设计定义为“作为独立于模型中的接口提供的操作，没有封装状态。”
 * 还可能表示类是“业务服务外观”（在核心J2EE模式意义上）或类似的东西。
 * 此注解充当@Component的专门化，允许通过类路径扫描自动检测实现类。
 */
@Service
@Transactional
public class ServiceQQUserImpl implements ServiceQQUser {
    /**
     * Resource注解:
     * Resource默认按照ByName自动注入，由J2EE提供，需要导入包javax.annotation.Resource。
     * Resource有两个重要的属性：name和type，而Spring将@Resource注解的name属性解析为bean的名字，而type属性则解析为bean的类型。
     * 所以，如果使用name属性，则使用byName的自动注入策略，而使用type属性时则使用byType自动注入策略。
     * 如果既不制定name也不制定type属性，这时将通过反射机制使用byName自动注入策略。
     */
    @Resource
    private DaoQQUser userMapper;

    /**
     * Override注解：
     * 指示方法声明旨在重写父类型中的方法声明。如果使用此注解类型对方法进行注解，则需要编译器生成错误消息，除非至少满足以下条件之一：
     * 该方法重写或实现在父类型中声明的方法。
     * 该方法具有一个重写的签名，该签名等同于在对象中声明的任何公共方法的签名。
     *
     * @param openid 获取信息的标识
     * @return qq用户信息
     */
    @Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
    @Cacheable(key = "'qqOpenidIs'+#p0", value = "redisCacheTime")
    @Override
    public QQUser getOpenid(String openid) {
        return userMapper.getOpenid(openid);
    }

    /**
     * @param userEntity qq用户实体类
     * @return 添加状态
     */
    @Override
    @CachePut(key = "#p0", value = "redisCacheTime")
    public int insert(QQUser userEntity) {
        return userMapper.insertQQ(userEntity);
    }

    /**
     * @param userEntity qq用户实体类
     * @return 修改状态
     */
    @Override
    @CachePut(key = "#p0", value = "redisCacheTime")
    public int update(QQUser userEntity) {
        return userMapper.updateQQ(userEntity);
    }

    /*
    @CachePut(key = "#p0", value = "redisCacheTime")
    public int register(String openid, String phone, String email) {
        return userMapper.register(openid, phone, email);
    }*/
}
